home *** CD-ROM | disk | FTP | other *** search
-
- ; Mit dieser Routine läßt sich das Laufwerk auslesen, von dem das laufende
- ; Programm gestartet wurde und gleichzeitig ein neuer Pfad auf diesem Lauf-
- ; werk setzen. Damit ist sichergestellt, daß das Programm seine Datenfiles
- ; immer und überall auch findet...
- ; Dies geht jedoch nur bei einem Workbenchstart!
-
- ; Am Ende des Listings ist ein Verwendungsbeispiel gegeben !!!!!!
-
- ; "DosBase" ist der Zeiger auf die geöffnete dos.library
-
- ;-------------------------------------------------------------------
- ; Startlaufwerk auslesen
-
- ; EINGABE : a0 - Zeiger auf Verzeichnis-String (ASCII+0)
- ; a1 - Message, die von der Workbench beim Programmstart
- ; übergeben wird. (s.Beispiel)
-
- ; AUSGABE : d0 - alter Disklock (long)
- ; d1 - neuer Disklock (-1 = Fehler!) (long)
-
- GetDrv: movem.l a2-a6/d2-d7,-(sp) ; Register retten
-
- move.l a0,-(sp) ; Zeiger sichern
-
- move.l a1,a0 ; Message von der Workbench
- move.l $24(a0),a0
- move.l (a0),d1 ; Zeiger auf Disk-Lock
-
- move.l #InfoBuf,d2 ; Info über Laufwerk holen
- move.l DosBase(pc),a6
- jsr -102(a6) ; Examine ()
- tst.l d0
- beq.s Error1 ; Fehler ?
-
- lea.l InfoBuf+8(pc),a0 ; Laufwerksbezeichner auslesen
-
- moveq #106,d0
- scrNL: tst.b (a0)
- beq.s cpNL
- cmp.b #":",(a0) ; Ende des Bezeichners suchen
- beq.s cpNL
- addq.l #1,a0
- dbf d0,scrNL ; nächstes Zeichen
- bra.s Error1 ; wenn 106 durch, dann Fehler
-
- cpNL: move.l (sp)+,a1
- move.b #":",(a0)+ ; Doppelpunkt anhängen
- cpPfad: move.b (a1),(a0)+
- tst.b (a1)+ ; Endkennung ?
- bne.s cpPfad
-
- move.l #InfoBuf+8,d1 ; Verzeichnis setzen
- moveq #-2,d2
- move.l DosBase(pc),a6
- jsr -84(a6) ; Lock ()
- move.l d0,d1
- beq.s Error2
- move.l d0,-(sp)
- move.l DosBase(pc),a6
- jsr -126(a6) ; CurrentDir ()
-
- ; in d0 ist jetzt der alte Lock !
-
- move.l (sp)+,d1 ; neuen Lock merken
-
- movem.l (sp)+,a2-a6/d2-d7 ; Register restaurieren
- rts
-
- Error1: move.l (sp)+,a0
- Error2: movem.l (sp)+,a2-a6/d2-d7 ; Register restaurieren
- moveq #-1,d1 ; Fehler signalisieren
- rts
-
- cnop 0,4
- InfoBuf: ds.b $104
-
-
-
- ;**********************************************************************
- ;**********************************************************************
-
- Beispiel:
-
- ;------------------------------------------
- ; Startup für sicheren WB und CLI Start
-
- movem.l a0/d0,-(sp) ; Kommandoparameter retten
-
- sub.l a1,a1
- jsr -294(a6) ; FindTask ()
- move.l d0,a4
- tst.l $AC(a4)
- bne.s noWB
- lea.l $5C(a4),a0
- jsr -384(a6) ; WaitPort ()
- lea.l $5C(a4),a0
- jsr -372(a6) ; GetMsg ()
- move.l d0,WBMsg
-
- noWB: movem.l (sp)+,a0/d0
- bsr.s Prog ; Programm aufrufen
- move.l d0,-(sp) ; Fehlercode merken
-
- tst.l WBMsg
- beq.s exit
- move.l 4.w,a6 ; EXECBASE laden
- jsr -132(a6) ; Forbid ()
- move.l WBMsg(pc),a1
- jsr -378(a6) ; ReplyMsg ()
-
- exit: move.l (sp)+,d0 ; Fehlercode zurück
- rts
-
- ;---------------------------------------
-
- Prog: lea.l DosName(pc),a1
- moveq #0,d0
- move.l 4.w,a6
- jsr -552(a6) ; OpenLib ()
- move.l d0,DosBase
- beq.s Err2
-
- LibOk: tst.l WBMsg ; WorkbenchStart ?
- beq.s Main ; nein, dann...
-
- lea.l DataV(pc),a0
- move.l WBMsg(pc),a1
- ;---------------------------------------
- bsr.w GetDrv ; Pfad setzen
- ;---------------------------------------
- cmp.w #-1,d1 ; Fehler ?
- beq.s Err1
-
- Main: ; **** Hier steht das eigentliche Programm... ****
-
- Err1: move.l 4.w,a6
- move.l DosBase(pc),a1
- jsr -414(a6) ; CloseLib ()
-
- Err2: moveq #20,d0 ; FehlerCode
- rts
-
- WBMsg: dc.l 0
- DosBase: dc.l 0
- DosName: dc.b "dos.library",0
- DataV: dc.b "DataFiles",0
-